My portfolio¶

In [1]:
%load_ext autoreload
%autoreload 2
In [2]:
from src.domain.distribution import SharesDistribution
from src.domain.share_type import Cap, Term, Region, ShareType

TOTAL = 1

distribution = SharesDistribution(
    # by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.75, 0.25))),
    # by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
    # by_cap=dict(zip((Cap.Large, Cap.Small), (0.8, 0.2))),
    # by_term=dict(zip((Term.Long, ), (1, ))),

    by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.6, 0.4))),
    by_region=dict(zip((Region.US, Region.ExUS), (1., 0.))),
    by_cap=dict(zip((Cap.Large, Cap.Small), (0.8, 0.2))),
    by_term=dict(zip((Term.Long, Term.Short), (0.5, 0.5))),
)

large_us_stocks = {
    # "VTI": 0.8,
    # "VNQ (REIT)": 0.2
    "VTI": 0.5,
    "GLD": 0.5
}

large_exus_stocks = {
    "EAFE": 1
}

small_us_stocks = {
    "Russell 2000": 1
}

small_exus_stocks = {
    "EAFE Small-Cap": 1
}

bonds = {
    "BND": 1,
    "SHY": 1
}

def assert_shares(obj):
    assert sum(obj.values()) == TOTAL

fund_shares = [large_us_stocks, large_exus_stocks, small_us_stocks, small_exus_stocks, bonds]

for shares in [distribution.by_cap, distribution.by_region, distribution.by_term, distribution.by_type] + fund_shares:
    assert_shares(shares)

###

flatten_stock_portfolio = []

stock_share = distribution.by_type[ShareType.Stock]

for (region_key, region_value) in distribution.by_region.items():
    for (cap_key, cap_value) in distribution.by_cap.items():
        flatten_stock_portfolio.append({
            "region": region_key.value,
            "share": stock_share * region_value * cap_value,
            "cap": cap_key.value
        })
        
def sort_by_share(portfolio):
    return sorted(portfolio, key=lambda x: x["share"], reverse=True)
        
flatten_stock_portfolio = sort_by_share(flatten_stock_portfolio)
In [4]:
from collections import OrderedDict
import pandas as pd
from IPython.display import display
from src.portfolio import prepare_stock_table_rows, get_stock_name
from src.display.portfolio import display_portfolio
from src.data.shares import SHARES_DATA

stocks_table = prepare_stock_table_rows(flatten_stock_portfolio)
    
df = pd.DataFrame(stocks_table, columns=['Share', 'Share of all'], index=[get_stock_name(x) for x in flatten_stock_portfolio])
display(df)

display_portfolio(distrib=distribution, funds=fund_shares, extra_stocks=OrderedDict({"VTI": SHARES_DATA["VTI"], "BND": SHARES_DATA["BND"]}))
Share Share of all
Us Large-cap stocks 56.0% 42.0%
Ex-us Large-cap stocks 24.0% 18.0%
Us Small-cap stocks 14.0% 10.5%
Ex-us Small-cap stocks 6.0% 4.5%
Portfolio
VTI 33.6%
VNQ (REIT) 8.4%
EAFE 18.0%
Russell 2000 10.5%
EAFE Small-Cap 4.5%
BND 25.0%
Mean ret. Std
Portfolio 8.56% 11.08%
VTI 10.98% 15.55%
BND 6.72% 5.3%

Golden Butterfly Portfolio¶

  • 20.00 % | IJS iShares S&P Small-Cap 600 Value Equity | U.S., Small Cap, Value
  • 20.00 % | VTI Vanguard Total Stock Market Equity | U.S., Large Cap
  • 20.00 % | TLT iShares 20+ Year Treasury Bond Bond | U.S., Long-Term
  • 20.00 % | SHY iShares 1-3 Year Treasury Bond Bond | U.S., Short Term
  • 20.00 % | GLD SPDR Gold Trust Commodity | Gold
In [11]:
from collections import OrderedDict
from src.display.portfolio import display_portfolio
from src.data.shares import SHARES_DATA

display_portfolio(funds=[{
    "VTI": 0.2,
    "GLD": 0.2,
    "BND": 0.2,
    "SHY": 0.2,
    "Russell 2000": 0.2,
}], extra_stocks=OrderedDict({"VTI": SHARES_DATA["VTI"], "BND": SHARES_DATA["BND"]}))
Portfolio
VTI 20.0%
GLD 20.0%
BND 20.0%
SHY 20.0%
Russell 2000 20.0%
Mean ret. Std
Portfolio 7.55% 7.51%
VTI 10.98% 15.55%
BND 6.72% 5.3%